home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / mint / lib / mntlib44.zoo / mntlib / lattice / setjmp.s < prev    next >
Text File  |  1993-10-20  |  3KB  |  162 lines

  1.     INCLUDE    inc.i
  2.     
  3.     INFO
  4.  
  5.     xref    ___mint
  6.     xref    __sigmask
  7.  
  8. ;
  9. ; setjmp.cpp 
  10. ;
  11.     CODE
  12.  
  13.     IF    _REGARG
  14.     xdef    @setjmp
  15.     xdef    @longjmp
  16.     xdef    @sigsetjmp
  17.     xdef    @siglongjmp
  18.     ELSE
  19.     xdef    _setjmp
  20.     xdef    _longjmp
  21.     xdef    _sigsetjmp
  22.     xdef    _siglongjmp
  23.     ENDC
  24.  
  25.     ; sigsetjmp(sigjmp_buf env, int savemask)
  26.     ; address of sigjmp_buf will be in a0
  27.     ; savemask will be in d0/a1 (signextended)
  28.     IF    _REGARG
  29. @sigsetjmp:
  30.     IF    _SHORT
  31.     ext.l    d0
  32.     ENDC
  33.     move.l    d0,52(a0)        ; save sigmask for siglongjmp?
  34.     ELSE
  35. _sigsetjmp:
  36.     move.l    4(sp),a0        
  37.     IF    _SHORT
  38.     move.w    8(sp),a1
  39.     ELSE
  40.     move.l    8(sp),a1
  41.     ENDC
  42.     move.l    a1,52(a0)        ; save sigmask for siglongjmp?
  43.     ENDC
  44.     
  45.     beq.w    Common            ; no -- call common code
  46.     
  47.     move.l    __sigmask,d0        ; save tos emulation signal mask
  48.     ; see if MiNT is active
  49.     IF    _SHORT
  50.     tst.w    ___mint
  51.     ELSE
  52.     tst.l    ___mint
  53.     ENDC
  54.     beq.w    SSJ_nomint        ; no -- skip Psigblock
  55.     clr.l    -(sp)            ; add no signals to sigmask
  56.     move.w    #$116,-(sp)        ; Psigblock() system call
  57.     trap    #1
  58.     addq    #6,sp
  59.  
  60. SSJ_nomint:
  61.     bset    #0,d0            ; make it != 0 (SIGNULL is unmaskable)
  62.     move.l    d0,52(a0)        ; save signal mask
  63.     bra    Common            ; call code common with setjmp
  64.  
  65.  
  66.     ; setjmp(sigjmp_buf env)
  67.     ; address of jmp_buf will be in a0
  68.     IF    _REGARG
  69. @setjmp:
  70.     ELSE
  71. _setjmp:
  72.     move.l    4(sp),a0
  73.     ENDC
  74.     
  75.     clr.l    52(a0)            ; do not restore sigmask on longjmp
  76. Common:
  77.     move.l    (sp),(a0)        ; save return address
  78.     movem.l    d2-d7/a2-a7,4(a0)    ; save registers d2-d7/a2-a7
  79.     moveq    #0,d0            ; return value is 0
  80.     rts
  81.  
  82.  
  83.     ; siglongjmp(sigjmpbuf env, int retval)
  84.     ; longjmp(sigjmpbuf env, int retval)
  85.     IF    _REGARG
  86. @longjmp:
  87. @siglongjmp:
  88.     ELSE
  89. _longjmp:
  90. _siglongjmp:
  91.     ENDC
  92.     ; see if MiNT is active
  93.     IF    _SHORT
  94.     tst.w    ___mint    
  95.     ELSE
  96.     tst.l    ___mint
  97.     ENDC
  98.     
  99.     beq.w    LJ_nomint        ; no -- do not call Psigreturn
  100.     
  101.     IF    _REGARG            ; save d0,a0 before Psigreturn
  102.     IF    _SHORT
  103.     move.w    d0,-(sp)
  104.     ELSE
  105.     move.l    d0,-(sp)
  106.     ENDC
  107.     move.l    a0,-(sp)
  108.     ENDC
  109.     move.w    #$11a,-(sp)        ; Psigreturn() system call
  110.     trap    #1            ; (ignored if not in a sig handler)
  111.     addq.w    #2,sp
  112.     
  113. LJ_nomint:
  114.     ; address of jmpbuf in a0
  115.     IF    _REGARG
  116.     move.l    (sp),a0
  117.     ELSE
  118.     move.l    4(sp),a0        
  119.     ENDC
  120.     
  121.     move.l    52(a0),d0        ; want to restore sigmask?
  122.     beq.w    Norestore        ; no -- skip restore code
  123.     bclr    #0,d0            ; dump SIGNUL
  124.     move.l    d0,__sigmask        ; restore tos emulation signal mask
  125.     
  126.     ; see if MiNT is active
  127.     IF    _SHORT
  128.     tst.w    ___mint
  129.     ELSE
  130.     tst.l    ___mint
  131.     ENDC
  132.     beq.w    Norestore        ; no -- do not call Psigblock
  133.     move.l    d0,-(sp)        ; add no signals to sigmask
  134.     move.w    #$117,-(sp)        ; Psigblock() system call
  135.     trap    #1
  136.     addq    #6,sp
  137.     move.l    (sp),a0            ; restore a0 == jmpbuf
  138.  
  139. Norestore:
  140.     ; value to return in d0 ...
  141.     IF    _REGARG
  142.     IF    _SHORT
  143.     move.w    4(sp),d0
  144.     ELSE
  145.     move.l    4(sp),d0
  146.     ENDC
  147.     ELSE
  148.     IF    _SHORT
  149.     move.w    8(sp),d0
  150.     ELSE
  151.     move.l    8(sp),d0
  152.     ENDC
  153.     ENDC
  154.     
  155.     bne.w    L1            ; ... may not be 0
  156.     moveq    #1,d0
  157. L1:
  158.     movem.l    4(a0),d2-d7/a2-a7    ; restore saved reggies
  159.     move.l    (a0),(sp)        ; and the saved return address
  160.     rts                ; will restore a7
  161.     end
  162.